home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / games.arc / OTHELLO.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  6.8 KB  |  249 lines

  1. 1000  REM  OTHELLO -- PET VERSION -- MODIFIED BY PATRICK   LEABO
  2. 1010  REM                                        TUCSON, ARIZONA
  3. 1020  REM                                             3-82
  4. 1025  REM NOT DONE YET BUT HAVE FUN -- PLEASE ADD A GOOD ALGORITHM TO IT
  5. 1026  REM
  6. 1030  SCREEN 0,0:COLOR 7,0:WIDTH 80:KEY OFF
  7. 1040  E$="":FOR I= 1 TO 39:E$= E$+ " ":NEXT
  8. 1050  D$= CHR$ (11)
  9. 1060  FOR I= 1 TO 20:D$= D$+ CHR$ (10):NEXT
  10. 1070  XL= 3:XH= 6:YL= 3:YH= 6
  11. 1080  DIM A(9,9),I4(7),J4(7),D$(2),P$(2):Z0= 0
  12. 1090  CLS:LOCATE 1,20:PRINT "GREETINGS FROM OTHELLO"
  13. 1100  PRINT :PRINT "OTHELLO  IS PLAYED ON AN 8 X 8 BOARD, ROWS NUMBERED"
  14. 1110  PRINT "1 TO 8  AND COLUMNS A TO H.   THE INITIAL CONFIGURATION IS"
  15. 1120  PRINT "ALL BLANK EXCEPT FOR THE CENTER FOUR SQUARES, TRY TO PLACE"
  16. 1130  PRINT "YOUR PIECE SO THAT IT OUTFLANKS YOUR  OPPONENT, CREATING "
  17. 1140  PRINT "HORIZONTAL, VERTICAL, OR DIAGONAL RUN OF OPPOSING PIECES,"
  18. 1150  PRINT "TURNING THEM INTO YOURS."
  19. 1160  PRINT
  20. 1170  PRINT:PRINT
  21. 1180  PRINT "EXAMPLE: RED OUTFLANKS BLUE, CAPTURING FOUR BLUE PIECES."
  22. 1190  PRINT "MAKE YOUR MOVE BY ENTERING A NUMBER FOR THE ROW AND A LETTER"
  23. 1200  PRINT "FOR THE COLUMN.  "
  24. 1210  PRINT "NOTE: YOU MUST CAPTURE AT LEAST ONE OF MY PIECES IN THIS WAY "
  25. 1220  PRINT "IF IT IS POSSIBLE.  IF IT IS NOT POSSIBLE, YOU FORFEIT YOUR"
  26. 1230  PRINT "MOVE BY ENTERING 0 A FOR YOUR MOVE."
  27. 1240  PRINT :PRINT "HOW MANY PLAYERS (1 OR 2)? ";:GOSUB 3220:IF VAL (X$)= 0 OR VAL (X$)> 2 THEN 1240
  28. 1250  PRINT X$:NP= VAL (X$):PRINT 
  29. 1260  IF NP= 2 THEN PRINT "PLAYER #1 GOES FIRST WHEN THE PLAY STARTS"
  30. 1270  SOUND 3000,2:INPUT "ENTER PLAYER 1,S NAME! ";P$(1):P$(1)= P$(1)+" "+ CHR$(2)
  31. 1280  SOUND 3000,2:IF NP= 2 THEN INPUT "ENTER PLAYER 2'S NAME! ";P$(2):P$(2)= P$(2)+" "+CHR$(1)
  32. 1290  IF NP= 2 THEN 1350
  33. 1300  PRINT :PRINT "SHOULD I PLAY MY BEST?";
  34. 1310  S2= 0:S4= 0:S5= 0:P$(2)= "IBM PC"
  35. 1320  GOSUB 3220:IF X$= "N"THEN PRINT "NO":GOTO 1350
  36. 1330  PRINT "YES"
  37. 1340  S2= 2:S4= 1:S5= - 2
  38. 1350  B= - 1:W= 1:PT= 0
  39. 1360  D$(B+ 1)= "RED":N$(B+ 1)= "RED "
  40. 1370  D$(0+ 1)= "BLANK"
  41. 1380  D$(W+ 1)= "BLUE":N$(W+ 1)= "BLUE"
  42. 1390  FOR K= 0 TO 7
  43. 1400  READ I4(K),J4(K)
  44. 1410  NEXT 
  45. 1420  FOR I= 0 TO 9:FOR J= 0 TO 9
  46. 1430  A(I,J)= 0
  47. 1440  NEXT J,I
  48. 1450  A(4,4)= W:A(5,5)= W
  49. 1460  A(4,5)= B:A(5,4)= B
  50. 1470  SC(1)= 2:SC(2)= 2:N1= 4:Z= 0
  51. 1480  C= B:H= W
  52. 1490  FOR NN= 1 TO 3000:NEXT :CLS
  53. 1500  GOSUB 3300
  54. 1510  IF NP= 2 THEN 2020
  55. 1520  PRINT D$"DO YOU WANT TO GO FIRST ? ";
  56. 1530  PT= 1:GOSUB 3220:IF X$= "Y"THEN PRINT "YES":PT= 0:GOTO 2020
  57. 1540  PT= 1:PRINT "NO":PRINT D$E$D$"OK, I AM THINKING!"
  58. 1550  REM  COMPUTERS MOVE
  59. 1560  IF NP= 1 THEN TIME$="0:0:0":GOTO 1600
  60. 1570  IF PT= 2 THEN B1= - 1:I3= 0:J3= 0:T1= C:T2= H
  61. 1580  IF PT= 1 THEN B1= - 1:I3= 0:J3= 0:T1= H:T2= C
  62. 1590  GOTO 2030
  63. 1600  PT= PT+ 1:IF PT> 2 THEN PT= 1
  64. 1610  B1= - 1:I3= 0:J3= 0:T1= C:T2= H
  65. 1620  FOR I= YL TO YH:FOR J= XL TO XH
  66. 1630  IF A(I,J)< > 0 THEN 1790
  67. 1640  GOSUB 2740
  68. 1650  IF F1= Z0 THEN 1790
  69. 1660  U= - 1
  70. 1670  GOSUB 2780
  71. 1680  IF S1= Z0 THEN 1790
  72. 1690  IF (I= 1)OR (I= 8)THEN S1= S1+ S2
  73. 1700  IF (J= 1)OR (J= 8)THEN S1= S1+ S2
  74. 1710  IF (I= 2)OR (I= 7)THEN S1= S1+ S5
  75. 1720  IF (J= 2)OR (J= 7)THEN S1= S1+ S5
  76. 1730  IF (I= 3)OR (I= 6)THEN S1= S1+ S4
  77. 1740  IF (J= 3)OR (J= 6)THEN S1= S1+ S4
  78. 1750  IF S1< B1 THEN 1790
  79. 1760  IF S1> B1 THEN 1780
  80. 1770  IF RND (1)> 0.5 THEN 1790
  81. 1780  B1= S1:I3= I:J3= J
  82. 1790  NEXT J,I
  83. 1800  IF B1> 0 THEN 1880
  84. 1810  IF S5= 0 THEN 1840
  85. 1820  IF NP= 1 THEN S5= 0:GOTO 1610
  86. 1830  S5= 0:GOTO 1550
  87. 1840  S5= 0:PRINT D$ E$ D$"I HAVE TO FORFEIT MY MOVE"
  88. 1850  IF Z= 1 THEN 2430
  89. 1860  Z= 1
  90. 1870  GOTO 2020
  91. 1880  Z= 0
  92. 1890  PRINT D$E$D$"I WILL MOVE TO ";RIGHT$ (STR$ (I3),1)" "CHR$ (J3+ 64)
  93. 1900  GOSUB 3090 REM 5
  94. 1910  I= I3:J= J3:U= 1
  95. 1920  GOSUB 2780
  96. 1930  SC(PT)= SC(PT)+ S1+ 1
  97. 1940  OP= PT+ 1:IF OP= 3 THEN OP= 1
  98. 1950  SC(OP)= SC(OP)- S1
  99. 1960  N1= N1+ 1
  100. 1970  PRINT D$E$D$"THAT GIVES ME ";
  101. 1980  PRINT S1;
  102. 1990  PRINT " OF YOUR PIECES"
  103. 2000  GOSUB 3390
  104. 2010  IF SC(OP)= 0 OR N1= 64 THEN 2430
  105. 2020  T1= H:T2= C
  106. 2030  PT= PT+ 1:IF PT> 2 THEN PT= 1
  107. 2040  IF PT= 2 THEN B1= - 1:I3= 0:J3= 0:T1= C:T2= H
  108. 2050  IF PT= 1 THEN B1= - 1:I3= 0:J3= 0:T1= H:T2= C
  109. 2060  BEEP
  110. 2070  TIME$="0:0:0":PRINT D$;E$D$;P$(PT)", INPUT YOUR MOVE ! ";:GOSUB 3020
  111. 2080  IF (I< 0)OR (J< 0)OR (J> 8)OR (I> 8)THEN 2040
  112. 2090  IF I< > 0 THEN 2160
  113. 2100  PRINT D$;E$D$;"ARE YOU FORFEITING YOUR TURN ? ";
  114. 2110  GOSUB 3220:IF X$< > "Y"THEN PRINT "NO":GOTO 2040
  115. 2120  PRINT "YES"
  116. 2130  IF Z= 1 THEN 2430
  117. 2140  Z1= 1
  118. 2150  GOTO 1550
  119. 2160  IF A(I,J)= 0 THEN 2190
  120. 2170  PRINT D$"SORRY,SQUARE OCCUPIED; TRY AGAIN"
  121. 2180  GOTO 2270
  122. 2190  GOSUB 2740
  123. 2200  IF F1= 1 THEN 2230
  124. 2210  PRINT D$""E$D$"SORRY,NOT NEXT TO MY PIECES; TRY AGAIN"
  125. 2220  GOTO 2270
  126. 2230  U= - 1
  127. 2240  GOSUB 2780
  128. 2250  IF S1> 0 THEN 2290
  129. 2260  PRINT D$""E$D$"SORRY,DOESN'T FLANK A ROW; TRY AGAIN"
  130. 2270  PRINT E$D$:BEEP:FOR N=1 TO 2000:NEXT
  131. 2280  GOTO 2040
  132. 2290  Z= 0:GOSUB 3150
  133. 2300  PRINT D$""E$D$""P$(PT)" THAT GIVES YOU ";
  134. 2310  PRINT S1;
  135. 2320  PRINT " PIECE";:IF S1> 1 THEN PRINT "S";
  136. 2330  PRINT :PRINT E$D$
  137. 2340  U= 1
  138. 2350  GOSUB 2780
  139. 2360  SC(PT)= SC(PT)+ S1+ 1
  140. 2370  OP= PT+ 1:IF OP= 3 THEN OP= 1
  141. 2380  SC(OP)= SC(OP)- S1
  142. 2390  N1= N1+ 1
  143. 2400  GOSUB 3390
  144. 2410  IF SC(OP)= 0 OR N1= 64 THEN 2430
  145. 2420  GOTO 1550
  146. 2430  PRINT D$;E$:PRINT E$:PRINT E$
  147. 2440  PRINT D$;E$D$;P$(1)"  HAS "SC(1)" PIECES   ";
  148. 2450  PRINT P$(2)" HAS "SC(2)" PIECES"
  149. 2460  IF SC(1)= SC(2)THEN 2510
  150. 2470  IF NP= 2 THEN 2540
  151. 2480  IF SC(1)> SC(2)THEN 2530
  152. 2490  PRINT "SORRY, I WON THAT ONE.";
  153. 2500  GOTO 2540
  154. 2510  PRINT "ITS A TIE !!";
  155. 2520  GOTO 2680
  156. 2530  PRINT "YOU WON!!!!!!";
  157. 2540  C1= SC(1)- SC(2)
  158. 2550  IF C1> 0 THEN 2570
  159. 2560  C1= - C1
  160. 2570  C1= (64* C1)/ N1
  161. 2580  PRINT "THAT WAS A ";
  162. 2590  IF C1< 11 THEN 2670
  163. 2600  IF C1< 25 THEN 2660
  164. 2610  IF C1< 39 THEN 2650
  165. 2620  IF C1< 53 THEN 2640
  166. 2630  PRINT "PERFECT GAME":GOTO 2680
  167. 2640  PRINT "WALKAWAY":GOTO 2680
  168. 2650  PRINT "FIGHT":GOTO 2680
  169. 2660  PRINT "HOT GAME":GOTO 2680
  170. 2670  PRINT "SQUEAKER"
  171. 2680  PRINT 
  172. 2690  PRINT "DO YOU WANT TO PLAY ANOTHER GAME ? ";:BEEP
  173. 2700  GOSUB 3220:IF X$= "Y"THEN PRINT "YES";:RUN 1040
  174. 2710  PRINT "NO"
  175. 2720  PRINT "THANKS FOR PLAYING."
  176. 2730  CHAIN "MENU",1000
  177. 2740  F1= Z0:FOR I1= - 1 TO 1:FOR J1= - 1 TO 1:IF A(I+ I1,J1+ J)= T2 THEN 2760
  178. 2750  NEXT J1,I1:RETURN 
  179. 2760  F1= 1:RETURN 
  180. 2770  REM  CHECK FOR COUNT & FLANKING PIECES
  181. 2780  S1= Z0:FOR K= 0 TO 7
  182. 2790  S3= Z0:I5= I4(K):J5= J4(K):I6= I+ I5:J6= J+ J5
  183. 2800  IF A(I6,J6)< > T2 THEN 2910
  184. 2810  S3= S3+ 1:I6= I6+ I5:J6= J6+ J5
  185. 2820  IF A(I6,J6)= T1 THEN 2850
  186. 2830  IF A(I6,J6)= Z0 THEN 2910
  187. 2840  GOTO 2810
  188. 2850  S1= S1+ S3
  189. 2860  IF U< > 1 THEN 2910
  190. 2870  I6= I:J6= J
  191. 2880  FOR K1= 0 TO S3
  192. 2890  A(I6,J6)= T1:I6= I6+ I5:J6= J6+ J5
  193. 2900  NEXT K1
  194. 2910  NEXT K
  195. 2920  RETURN 
  196. 2930  REM  3SET SEARCH LIMITS FOR COMPUTER MOVE5
  197. 2940  IF I= YL THEN YL= YL- 1:IF YL< 1 THEN YL= 1
  198. 2950  IF I= YH THEN YH= YH+ 1:IF YH> 8 THEN YH= 8
  199. 2960  IF J= XL THEN XL= XL- 1:IF XL< 1 THEN XL= 1
  200. 2970  IF J= XH THEN XH= XH+ 1:IF XH> 8 THEN XH= 8
  201. 2980  LOCATE 1,1:PRINT TI$;"   "
  202. 2990  RETURN 
  203. 3000  REM  INPUT SUBROUTINE5"
  204. 3010  PRINT D$E$"BAD MOVE; TRY AGAIN."
  205. 3020  I= - 1:J= - 1
  206. 3030  FOR K= 1 TO 2
  207. 3040  GOSUB 3220
  208. 3050  G= ASC (X$)
  209. 3060  IF 47< G AND G< 58 THEN I= G- 48:PRINT ""X$"  ";
  210. 3070  IF 64< G AND G< 74 THEN J= G- 64:PRINT ""X$"  ";
  211. 3080  NEXT :PRINT :RETURN 
  212. 3090  REM BLINK COMPUTERS MOVE5
  213. 3100  LOCATE 2* J3+ 3,4* I3+ 1:COLOR 26,0:PRINT CHR$(1):COLOR 7,0
  214. 3110  I= I3:J= J3
  215. 3120  GOSUB 2940
  216. 3130  FOR NN= 1 TO 1000:NEXT 
  217. 3140  RETURN 
  218. 3150  REM BLINK PLAYERS MOVE5
  219. 3160  IF PT= 2 THEN CC= 0
  220. 3170  IF PT= 1 THEN CC= 2
  221. 3180  LOCATE 2* J+ 3,4* I+ 1:COLOR 26,0:PRINT CHR$(2):COLOR 7,0
  222. 3190  GOSUB 2940
  223. 3200  FOR NN= 1 TO 500:NEXT 
  224. 3210  RETURN 
  225. 3220  REM INPUT STATEMENTS
  226. 3230  SOUND 3000,2
  227. 3240  X$=INKEY$:IF X$="" THEN 3240 ELSE IF X$=CHR$(27) THEN CHAIN "B:MENU",1000 ELSE RETURN
  228. 3250  REM  PRINT SCORE
  229. 3260  LOCATE 5,36:PRINT CHR$(2);RIGHT$ ("  "+ STR$ (SC(1)),3);" ":LOCATE 19,36:PRINT CHR$(1);RIGHT$ ("  "+ STR$ (SC(2)),3);" ";:LOCATE 1,1
  230. 3270  RETURN
  231. 3280  REM BOARD DATA
  232. 3290  DATA 0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1
  233. 3300  REM 5 OTHER OTHELLO BOARD
  234. 3310  CLS:LOCATE 1,10:PRINT "O T H E L L O"
  235. 3320  LOCATE 3,5:PRINT"1   2   3   4   5   6   7   8"
  236. 3330  FOR N=1 TO 8:LOCATE 3+2*N,1:PRINT CHR$(N+64):NEXT
  237. 3340  LOCATE 4,3  :PRINT"KEYTHENTHENTHEN<0xCB!>THENTHENTHEN<0xCB!>THENTHENTHEN<0xCB!>THENTHENTHEN<0xCB!>THENTHENTHEN<0xCB!>THENTHENTHEN<0xCB!>THENTHENTHEN<0xCB!>THENTHENTHENCLOSE":FOR N=1 TO 13 STEP 2
  238. 3350  LOCATE 4+N,3:PRINT"OPEN   OPEN   OPEN   OPEN   OPEN   OPEN   OPEN   OPEN   OPEN"
  239. 3360  LOCATE 5+N,3:PRINT"TOTHENTHENTHENTAB(THENTHENTHENTAB(THENTHENTHENTAB(THENTHENTHENTAB(THENTHENTHENTAB(THENTHENTHENTAB(THENTHENTHENTAB(THENTHENTHENRANDOMIZE":NEXT
  240. 3370  LOCATE 4+N,3:PRINT"OPEN   OPEN   OPEN   OPEN   OPEN   OPEN   OPEN   OPEN   OPEN"
  241. 3380  LOCATE 5+N,3:PRINT"SCREENTHENTHENTHENLOCATETHENTHENTHENLOCATETHENTHENTHENLOCATETHENTHENTHENLOCATETHENTHENTHENLOCATETHENTHENTHENLOCATETHENTHENTHENLOCATETHENTHENTHENLOAD"
  242. 3390  FOR I= 1 TO 8
  243. 3400  FOR J= 1 TO 8:LOCATE 2* J+ 3,4* I+ 1:FACE= (A(I,J)+ 3)/2
  244. 3410  IF FACE = 1.5 THEN PRINT" " ELSE PRINT CHR$(FACE)
  245. 3420  NEXT J,I
  246. 3430  GOSUB 3250
  247. 3440  RETURN
  248. 3450  GOTO 2730
  249.